package com.sakura.mall.generator;

import com.sakura.mall.generator.config.GeneratorConfig;
import com.sakura.mall.generator.service.CodeGeneratorService;
import com.sakura.mall.generator.service.DatabaseService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
import java.util.stream.Collectors;

/**
 * 代码生成器主类
 * 使用SpringBoot非web容器方式启动
 */
@SpringBootApplication(exclude = {WebMvcAutoConfiguration.class})
public class GeneratorMain {
    @Autowired
    public ApplicationContext applicationContext;

    public static void main(String[] args) {
        SpringApplication.run(GeneratorMain.class, args);
    }

    /**
     * 代码生成执行器
     */
    @Bean
    public CommandLineRunner generatorRunner(DatabaseService databaseService, CodeGeneratorService codeGeneratorService, GeneratorConfig config) {
        return args -> {
            System.out.println("====== 代码生成器启动 ======");
            System.out.println("包名: " + config.getPackageName());
            System.out.println("模块名: " + config.getModuleName());
            System.out.println("表前缀: " + config.getTablePrefix());
            System.out.println("作者: " + config.getAuthor());
            System.out.println("输出目录: " + config.getOutputDir());

            // 获取所有表
            List<String> allTables = databaseService.getAllTableNames();
            if (allTables.isEmpty()) {
                System.out.println("没有找到数据表，请检查数据库连接配置");
                return;
            }

            List<String> tablesToGenerate = new ArrayList<>();

            // 如果命令行参数指定了表名，优先使用命令行参数
            if (args.length > 0) {
                tablesToGenerate.addAll(Arrays.asList(args));
            }
            // 如果配置文件中指定了表名，使用配置的表名
            else if (config.getTables() != null && !config.getTables().isEmpty()) {
                tablesToGenerate.addAll(config.getTables());
            }
            // 如果需要显示所有表供选择
            else if (config.isShowAllTables()) {
//                tablesToGenerate = selectTablesInteractively(allTables);
                tablesToGenerate = allTables;
            }
            // 如果没有任何表名指定，生成所有表
            if (tablesToGenerate.isEmpty()) {
                System.out.println("未指定要生成的表，将生成所有表的代码");
                tablesToGenerate.addAll(allTables);
            }

            // 验证表名是否存在
            List<String> validTables = tablesToGenerate.stream()
                    .filter(allTables::contains)
                    .collect(Collectors.toList());

            // 输出无效表名
            List<String> invalidTables = tablesToGenerate.stream()
                    .filter(table -> !allTables.contains(table))
                    .collect(Collectors.toList());
            if (!invalidTables.isEmpty()) {
                System.out.println("以下表不存在，将被忽略：" + invalidTables);
            }

            if (validTables.isEmpty()) {
                System.out.println("没有有效的表名，无法生成代码");
                return;
            }

            // 开始生成代码
            System.out.println("\n将生成以下表的代码:");
            for (String tableName : validTables) {
                System.out.println("- " + tableName);
            }

            System.out.println("\n开始生成代码...");
            List<String> files = codeGeneratorService.generate(validTables);

            System.out.println("\n代码生成完成，共生成文件数量: " + files.size());
            for (String file : files) {
                System.out.println("生成文件: " + file);
            }

            // 生成完毕后退出应用
            // 获取springboot上下文，然后退出springboot系统
            SpringApplication.exit(applicationContext);
        };
    }

    /**
     * 交互式选择表
     */
    private static List<String> selectTablesInteractively(List<String> allTables) {
        List<String> selectedTables = new ArrayList<>();
        Scanner scanner = new Scanner(System.in);

        System.out.println("\n找到以下表:");
        for (int i = 0; i < allTables.size(); i++) {
            System.out.printf("%d. %s%n", i + 1, allTables.get(i));
        }

        System.out.print("\n请输入要生成的表序号(多个表用逗号分隔)，输入all生成所有表，直接回车退出: ");
        String input = scanner.nextLine().trim();

        if (input.isEmpty()) {
            return selectedTables;
        }

        if ("all".equalsIgnoreCase(input)) {
            return new ArrayList<>(allTables);
        }

        String[] selections = input.split(",");
        for (String selection : selections) {
            try {
                int index = Integer.parseInt(selection.trim()) - 1;
                if (index >= 0 && index < allTables.size()) {
                    selectedTables.add(allTables.get(index));
                }
            } catch (NumberFormatException e) {
                // 如果输入的不是数字，尝试作为表名处理
                if (allTables.contains(selection.trim())) {
                    selectedTables.add(selection.trim());
                }
            }
        }

        return selectedTables;
    }
} 